package com.xyht.sca_s.student_manage_system.modules.org.util;


import com.xyht.sca_s.student_manage_system.auth.entity.Node;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Component
public class NodeTreeUtil {
    /**
     * 根据父节点的ID获取所有子节点
     * @param list 分类表
     * @param typeId 传入的父节点ID
     * @return String
     */
    public Node getChildNodesTree(List<Node> list, Integer typeId) {
        if(list == null && typeId == null) return null;
        assert list != null;
        Node parentNode = new Node();
        for (Node node : list) {
            // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点
//            if (node.getParentId() == 0 && typeId.equals(node.getId())) {
//                recursionFn(list, node);
//            }
            if (typeId.equals(node.getId())) {
                parentNode = node;
                recursionFn(list, parentNode);
            }
            // 二、遍历所有的父节点下的所有子节点
            /*if (node.getParentId()==0) {
                recursionFn(list, node);
            }*/
        }
        return parentNode;
    }

    private void recursionFn(List<Node> list, Node node) {
        List<Node> childList = getChildList(list, node);// 得到子节点列表
        node.setChildNodeList(childList);
        for (Node n : node.getChildNodeList()) {
            if (hasChild(list, n)) {
                recursionFn(list, n);
            }
        }
    }

    // 得到子节点列表
    private List<Node> getChildList(List<Node> list, Node node) {
        List<Node> nodeList = new ArrayList<Node>();
        for (Node n : list) {
            if (n.getParentId().equals(node.getId())) {
                nodeList.add(n);
            }
        }

        return nodeList;
    }

    // 判断是否有子节点
    private boolean hasChild(List<Node> list, Node node) {
        return getChildList(list, node).size() > 0;
    }
}
